/*
 * @Author: yy.yy 729853861@qq.com
 * @Date: 2023-02-07 10:54:14
 * @LastEditors: yy.yy 729853861@qq.com
 * @LastEditTime: 2023-02-16 13:20:38
 * @FilePath: \ctr_simulition\mpc_ctrl.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace Eigen;
class Parament_mpc
{
public:
    int m_size_n   ; // 输入矩阵的列尺寸
    int m_size_N ;  // 输入矩阵的行尺寸
    int m_size_p  ; //输出矩阵的列尺寸

    //状态变量 ， 输入
    Eigen::MatrixXf m_Xk ; //储存状态变量
    Eigen::MatrixXf m_Uk ; //储存输入
    Eigen::MatrixXf m_xk ; //实时状态变量
    Eigen::MatrixXf m_uk ; //实时输入
    int m_storage_quantity ; 
    //输入状态空间方程矩阵
    Eigen::MatrixXf m_A ;
    Eigen::MatrixXf m_B ;

    //权重矩阵
    Eigen::MatrixXf m_R ; // p*p
    Eigen::MatrixXf m_Rbar;
    Eigen::MatrixXf m_Q ;  // n*n
    Eigen::MatrixXf m_Qbar;
    Eigen::MatrixXf m_F; // n*n

    //计算参数矩阵
    Eigen::MatrixXf m_M ;
    Eigen::MatrixXf m_C ; 
    Eigen::MatrixXf m_E ; 
    Eigen::MatrixXf m_H ; 
    
    //限幅矩阵
    Eigen::MatrixXf m_Ai ;
    Eigen::MatrixXf m_bi ;

   
public:
    Parament_mpc(const Ref<const MatrixXf>& a,const Ref<const MatrixXf>& b,const Ref<const MatrixXf>& q,
    const Ref<const MatrixXf>& r,const Ref<const MatrixXf>& f,int N);
    ~Parament_mpc(){} ; 
    void Print_size();
    void Calculation_mpc(const Ref<const MatrixXf>& a , const Ref<const MatrixXf>& b);
    MatrixXf Quadprog(const Ref<const MatrixXf>& H , const Ref<const MatrixXf>& f); //二次规划函数,无约束，H必须为正定，具体参照matlab官网 quadprog函数介绍
    MatrixXf Quadprog(const Ref<const MatrixXf>& H , const Ref<const MatrixXf>& f , const Ref<const MatrixXf>& ai , const Ref<const MatrixXf>& bi);
    MatrixXf Prediction(const Ref<const MatrixXf>& a , const Ref<const MatrixXf>& b,const Ref<const MatrixXf>& x0);//最终预测函数
    
};
